package com.pattern.singleton.lazy;

/**
 * Description 双层检验锁+防止指令重排优化
 *
 * @author hubiao
 * @since 2020-08-20 20:29
 */
public class LazyDoubleCheckSingleton {

    /**
     * 1.声明类 volatile:防止JVM指令重排
     */
    private volatile static LazyDoubleCheckSingleton lazySingleton = null;

    /**
     * 2.声明私有构造方法 使类不能被 new创建
     */
    private LazyDoubleCheckSingleton() {
    }

    /**
     * 3.提供一个全局的访问点
     * 注意：为了防止多线程情况下违背了单例模式，双层检验锁来防止多线程情况下创建多个实例
     */
    public synchronized static LazyDoubleCheckSingleton getInstance() {
        //当lazySingleton为null的时候实例化类，否则直接返回
        if (lazySingleton == null) {
            synchronized (LazyDoubleCheckSingleton.class) {
                if (lazySingleton == null) {
                    lazySingleton = new LazyDoubleCheckSingleton();
                }
            }
        }
        return lazySingleton;
    }
}
